home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル実用編 / ペイント / GPLUPE.C < prev    next >
Text File  |  1994-03-10  |  19KB  |  568 lines

  1. /******************************************************************************
  2.  *    gplupe.c:    ルーペ(拡大編集)サブウィンドウ関係のモジュール
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <console.h>        /* コンソール系マネージャを利用するときに必要 */
  8. #include <event.h>        /* イベントマンを利用するときに必要    */
  9. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  10. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  11. #include "gpaint.h"        /* このプログラム固有のヘッダファイル    */
  12.  
  13. /* ルーペウィンドウの内部レクタングル */
  14. static Rect rcLupeDraw = { 1, WS_INSIDE_Y, 401, WS_INSIDE_Y + 400 };
  15.  
  16. /******************************************************************************
  17.  *    moveLupeRect():    拡大範囲のレクタングルを移動する
  18.  ******************************************************************************
  19.  *    引数:    ComVal *pcv    共通変数へのポインタ
  20.  *        LPoint lpt    マウスレフトダウン時の座標
  21.  */
  22. void moveLupeRect(ComVal *pcv, LPoint lpt)
  23. {
  24.     short work;
  25.     Point opt, npt, dpt;
  26.     Rect rc;
  27.  
  28.     /* メインウィンドウをカレントグラフにする */
  29.     /* GMSetGraph(&pcv->windowPtr->graph); */
  30.  
  31.     if (pcv->subwinPtr[LUPE] == NULL || !GMPtInRect(&pcv->rcLupe, lpt))
  32.         return;
  33.  
  34.     /* メインウィンドウをテキストタイプでカレントグラフにする */
  35.     setGraph(pcv->windowPtr, G_TXT);
  36.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  37.     OldFC = GMForeColor(G_BLACK);    /* フォアグラウンドカラーを黒にする */
  38.     OldPM = GMPenMode(G_XOR);    /* ペンモードをXORにする    */
  39.     /* ペンサイズを(1,1)に設定する */
  40.     OldPS.x_y = GMPenSize(LONGWORD(1, 1));
  41.  
  42.     /* 拡大範囲レクタングルの初期のレクタングルを設定する */
  43.     rc = pcv->rcLupe;
  44.  
  45.     opt.x_y = lpt;
  46.     npt.x_y = lpt;
  47.     while (EMLStill()) {
  48.         /* マウスが移動された場合のみ拡大レクタングルを書き換える */
  49.         if (opt.x_y != npt.x_y) {
  50.             /* 前回のレクタングルを消して */
  51.             GMFrameRect(&rc);
  52.             /* 新たなレクタングルの算出 */
  53.             dpt.p.x = npt.p.x - opt.p.x;
  54.             dpt.p.y = npt.p.y - opt.p.y;
  55.             GMSlideRect(&rc, dpt.x_y);
  56.             /* レクタングルを調節する */
  57.             work = 100 - (LOWWORD(pcv->toolStat[4]) * 50);
  58.             if (rc.d.right > pcv->pictSize.d.right) {
  59.                 rc.d.left = pcv->pictSize.d.right - work;
  60.                 rc.d.right = pcv->pictSize.d.right;
  61.             }
  62.             if (rc.d.bottom > pcv->pictSize.d.bottom) {
  63.                 rc.d.top = pcv->pictSize.d.bottom - work;
  64.                 rc.d.bottom = pcv->pictSize.d.bottom;
  65.             }
  66.  
  67.             if (rc.d.left < 0) {
  68.                 rc.d.left = 0;
  69.                 rc.d.right = work;
  70.             }
  71.             if (rc.d.top < 0) {
  72.                 rc.d.top = 0;
  73.                 rc.d.bottom = work;
  74.             }
  75.             /* 再度レクタングルを表示する */
  76.             GMFrameRect(&rc);
  77.         }
  78.         opt = npt;
  79.         /* マウスの現在位置を取得する */
  80.         npt.x_y = EMMSLoc();
  81.     }
  82.  
  83.     /* フォアグラウンドカラーを元に戻す */
  84.     GMForeColor(OldFC);
  85.     /* ペンモードを元に戻す */
  86.     GMPenMode(OldPM);
  87.     /* ペンサイズを元に戻す */
  88.     GMPenSize(OldPS.x_y);
  89.  
  90.     /* メインウィンドウをグラフィックタイプでカレントグラフにする */
  91.     setGraph(pcv->windowPtr, G_GRP);
  92.     if (!GMEqualRect(&rc, &pcv->rcLupe)) {
  93.         /* 拡大範囲レクタングルを更新する */
  94.         pcv->rcLupe = rc;
  95.         /* ルーペウィンドウの内部を描く */
  96.         drawLupeRect(pcv);
  97.     }
  98.  
  99.     /* メインウィンドウをカレントグラフにする */
  100.     GMSetGraph(&pcv->windowPtr->graph);
  101. }
  102.  
  103. /******************************************************************************
  104.  *    dispLupeRect():    拡大範囲のレクタングルを表示(消去)する
  105.  ******************************************************************************
  106.  *    引数:    ComVal *pcv    共通変数へのポインタ
  107.  */
  108. void dispLupeRect(ComVal *pcv)
  109. {
  110.     /* ルーペウィンドウが表示されていないか、ファイル入出力疑似ダイアログが
  111.        でているか、サイズ設定疑似ダイアログがでていれば何もしない */
  112.     if (pcv->subwinPtr[LUPE] == NULL
  113.      || pcv->fileMode != 0 || pcv->sizeDlg != 0)
  114.         return;
  115.  
  116.     /* メインウィンドウをテキストタイプでカレントグラフにする */
  117.     setGraph(pcv->windowPtr, G_TXT);
  118.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  119.     OldFC = GMForeColor(G_BLACK);    /* フォアグラウンドカラーを黒にする */
  120.     OldPM = GMPenMode(G_XOR);    /* ペンモードをXORにする    */
  121.     /* ペンサイズを(1,1)に設定する */
  122.     OldPS.x_y = GMPenSize(LONGWORD(1, 1));
  123.  
  124.     GMFrameRect(&pcv->rcLupe);    /* レクタングルを表示(消去)する */
  125.  
  126.     GMForeColor(OldFC);        /* フォアグラウンドカラーを元に戻す */
  127.     GMPenMode(OldPM);        /* ペンモードを元に戻す        */
  128.     GMPenSize(OldPS.x_y);        /* ペンサイズを元に戻す        */
  129. }
  130.  
  131. /******************************************************************************
  132.  *    lupeMsLDown():    ルーペウィンドウでのマウス左ダウン処理
  133.  ******************************************************************************
  134.  *    引数:    ComVal *pcv    共通変数へのポインタ
  135.  */
  136. void lupeMsLDown(ComVal *pcv)
  137. {
  138.     LPoint lpt;
  139.  
  140.     /* ファイル入出力疑似ダイアログが表示されているかまたは
  141.        サイズ設定疑似ダイアログが表示されていたら */
  142.     if (pcv->fileMode > 0 || pcv->sizeDlg > 0)
  143.         /* 何もしない */
  144.         return;
  145.  
  146.     /* 入力座標をローカル座標系に変換する */
  147.     lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
  148.     if (!(GMPtInRect(&rcLupeDraw, lpt)))
  149.         return;
  150.  
  151.     /* UNDOのためにデータをセーブする */
  152.     saveDataForUndo(pcv);
  153.  
  154.     switch (HIWORD(pcv->toolStat[4])) {
  155.     case 0:                /* ルーペのモードがペンなら */
  156.         paintLupePen(pcv);
  157.         break;
  158.     case 1:                /* ルーペのモードが塗りつぶしなら */
  159.         paintLupeOfDomain(pcv);
  160.         break;
  161.     }
  162.  
  163.     if (!pcv->editFlag)        /* まだ編集されてないか?    */
  164.         pcv->editFlag = TRUE;    /* 編集フラグをセットする    */
  165. }
  166.  
  167. /******************************************************************************
  168.  *    paintLupePen():    ルーペ内でのペンでのペイント処理
  169.  ******************************************************************************
  170.  *    引数:    ComVal *pcv    共通変数へのポインタ
  171.  */
  172. void paintLupePen(ComVal *pcv)
  173. {
  174.     Point ptin, ptl, pt, npt, opt, wpt[2];
  175.     Rect rc, lrc;
  176.  
  177.     wpt[0] = pcv->penSize;
  178.     wpt[1].x_y = 0;
  179.  
  180.     /* 入力座標をローカル座標系に変換する */
  181.     ptin.x_y = GMGlobalToLocal(pcv->event.ev.where.x_y);
  182.  
  183.     ptl.p.x = (ptin.p.x - 1) / pcv->lupeRate;
  184.     ptl.p.y = (ptin.p.y - WS_INSIDE_Y) / pcv->lupeRate;
  185.     /* オフスクリーンの描画座標を求める */
  186.     pt.p.x = ptl.p.x + pcv->rcLupe.d.left;
  187.     pt.p.y = ptl.p.y + pcv->rcLupe.d.top;
  188.  
  189.     /* 絵と拡大レクタングルの共通部分を求める */
  190.     GMAndRect(&rc, &pcv->rcLupe, &pcv->pictSize);
  191.  
  192.     /* 点が絵と拡大レクタングルの共通部分になければ何もしない */
  193.     if (!GMPtInRect(&rc, pt.x_y))
  194.         return;
  195.  
  196.     /* 拡大レクタングルの範囲になるよう調節する */
  197.     ajustPoint(&pt, wpt, &rc);
  198.     /* ルーペウィンドウの描画座標を求める */
  199.     ptl.p.x = (pt.p.x - pcv->rcLupe.d.left) * pcv->lupeRate;
  200.     ptl.p.y = (pt.p.y - pcv->rcLupe.d.top) * pcv->lupeRate;
  201.  
  202.     ptl.p.x += 1;
  203.     ptl.p.y += WS_INSIDE_Y;
  204.  
  205.     /* ビッツを使用するためにメモリをロックする */
  206.     GMLockBits(pcv->offBitsHdl[pcv->offIdx]); /* オフスクリーン用ビッツ */
  207.  
  208.     /* オフスクリーン用グラフをカレントグラフにする */
  209.     GMSetGraph(&pcv->offGraph);
  210.     pcv->offGraph.bmap = &(*pcv->offBitsHdl[pcv->offIdx])->bmap;
  211.  
  212.     /* 転送レクタングルを設定する */
  213.     lrc.l.l_t = 0;
  214.     lrc.d.right = pcv->penSize.p.x * pcv->lupeRate;
  215.     lrc.d.bottom = pcv->penSize.p.y * pcv->lupeRate;
  216.     GMSlideRect(&lrc, ptl.x_y);
  217.     rc.l.l_t = 0;
  218.     rc.l.r_b = pcv->penSize.x_y;
  219.     GMSlideRect(&rc, pt.x_y);
  220.  
  221.     GMPenSize(pcv->penSize.x_y);    /* ペンサイズを設定する        */
  222.     /* フォアグラウンドカラーをセットする */
  223.     /* 選択中のパレット番号セット*/
  224.     setFBColor(pcv);
  225.     /* マウスの押された場所を描画する */
  226.     GMMove(pt.x_y);
  227.     GMLine(pt.x_y);
  228.  
  229.     /* メインウィンドウをグラフィックタイプでカレントグラフにする */
  230.     setGraph(pcv->windowPtr, G_GRP);
  231.     /* マウスの押された場所を描画する */
  232.     /* オフスクリーンからコピーして描画する */
  233.     GMTransImg(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, pcv->windowPtr->graph.bmap, &rc, &rc);
  234.  
  235.     /* ルーぺウィンドウをグラフィックタイプでカレントグラフにする */
  236.     setGraph(&pcv->subwinPtr[LUPE]->win, G_GRP);
  237.     /* オフスクリーンからコピーして描画する */
  238.     GMTransImg(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, pcv->subwinPtr[LUPE]->win.graph.bmap, &rc, &lrc);
  239.     opt = pt;
  240.     npt = pt;
  241.     while (EMLStill()) {
  242.         /* マウスが移動された場合のみ直線を表示する */
  243.         if (opt.x_y != npt.x_y) {
  244.  
  245.             /* オフスクリーン用グラフをカレントグラフにする */
  246.             GMSetGraph(&pcv->offGraph);
  247.             pcv->offGraph.bmap = &(*pcv->offBitsHdl[pcv->offIdx])->bmap;
  248.             /* 転送レクタングルを設定する */
  249.             lrc.l.l_t = 0;
  250.             lrc.d.right = pcv->penSize.p.x * pcv->lupeRate;
  251.             lrc.d.bottom = pcv->penSize.p.y * pcv->lupeRate;
  252.             GMSlideRect(&lrc, ptl.x_y);
  253.             rc.l.l_t = 0;
  254.             rc.l.r_b = pcv->penSize.x_y;
  255.             GMSlideRect(&rc, npt.x_y);
  256.  
  257.             /* オフスクリーンに描画する */
  258.             GMMove(npt.x_y);
  259.             GMLine(npt.x_y);
  260.  
  261.             /* メインウィンドウをカレントグラフにする */
  262.             GMSetGraph(&pcv->windowPtr->graph);
  263.             /* オフスクリーンからコピーして描画する */
  264.             GMTransImg(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, pcv->windowPtr->graph.bmap, &rc, &rc);
  265.  
  266.             /* カレントグラフをルーペウィンドウにする */
  267.             GMSetGraph(&pcv->subwinPtr[LUPE]->win.graph);
  268.  
  269.             /* オフスクリーンからコピーして描画する */
  270.             GMTransImg(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, pcv->subwinPtr[LUPE]->win.graph.bmap, &rc, &lrc);
  271.         }
  272.         opt = npt;
  273.         /* カレントグラフをルーペウィンドウにする */
  274.         GMSetGraph(&pcv->subwinPtr[LUPE]->win.graph);
  275.         /* マウスの現在位置を取得する */
  276.         ptl.x_y = EMMSLoc();
  277.         ptl.p.x = (ptl.p.x - 1) / pcv->lupeRate;
  278.         ptl.p.y = (ptl.p.y - WS_INSIDE_Y) / pcv->lupeRate;
  279.         /* オフスクリーンの描画座標を求める */
  280.         npt.p.x = ptl.p.x + pcv->rcLupe.d.left;
  281.         npt.p.y = ptl.p.y + pcv->rcLupe.d.top;
  282.         /* 拡大レクタングルの範囲になるよう調節する */
  283.         ajustPoint(&npt, wpt, &pcv->rcLupe);
  284.         /* ルーペウィンドウの描画座標を求める */
  285.         ptl.p.x = (npt.p.x - pcv->rcLupe.d.left) * pcv->lupeRate;
  286.         ptl.p.y = (npt.p.y - pcv->rcLupe.d.top) * pcv->lupeRate;
  287.         ptl.p.x += 1;
  288.         ptl.p.y += WS_INSIDE_Y;
  289.     }
  290.     /* ビッツのメモリをアンロックする */
  291.     GMUnlockBits(pcv->offBitsHdl[pcv->offIdx]);
  292.  
  293.     /* フォアグラウンドカラーを元に戻す */
  294.     GMForeColor(OldFC);
  295.     /* 描画モードを元に戻す */
  296.     GMPenMode(OldPM);
  297.     /* ペンモードを元に戻す */
  298.     GMPenMode(OldPM);
  299.     /* ペンサイズを元に戻す */
  300.     GMPenSize(OldPS.x_y);
  301. }
  302.  
  303. /******************************************************************************
  304.  *    paintLupeOfDomain():    ルーペ内の指定された点と同じ色の領域の塗りつぶし
  305.  ******************************************************************************
  306.  *    引数:    ComVal *pcv    共通変数へのポインタ
  307.  */
  308. void paintLupeOfDomain(ComVal *pcv)
  309. {
  310.     int errCode;
  311.     Point pt, pt2;
  312.     Rect rc, lrc;
  313.     Region **rgnHdl;
  314.     Bits **lBitsHdl;
  315.  
  316.     /* 入力座標をローカル座標系に変換する */
  317.     pt.x_y = GMGlobalToLocal(pcv->event.ev.where.x_y);
  318.  
  319.     pt2.p.x = (pt.p.x - 1) / pcv->lupeRate;
  320.     pt2.p.y = (pt.p.y - WS_INSIDE_Y) / pcv->lupeRate;
  321.  
  322.     /* オフスクリーンの描画座標を求める */
  323.     pt.p.x = pt2.p.x + pcv->rcLupe.d.left;
  324.     pt.p.y = pt2.p.y + pcv->rcLupe.d.top;
  325.  
  326.     /* 絵と拡大レクタングルの共通部分を求める */
  327.     GMAndRect(&rc, &pcv->rcLupe, &pcv->pictSize);
  328.  
  329.     /* 点が絵と拡大レクタングルの共通部分になければ何もしない */
  330.     if (!GMPtInRect(&rc, pt.x_y))
  331.         return;
  332.  
  333.     lrc.l.l_t = 0;
  334.     lrc.d.right = pcv->rcLupe.d.right - pcv->rcLupe.d.left;
  335.     lrc.d.bottom = pcv->rcLupe.d.bottom - pcv->rcLupe.d.top;
  336.  
  337.     /* 使用するリージョンハンドルを取得する */
  338.     rgnHdl = GMNewRgn();
  339.     if (rgnHdl == NULL) {
  340.         DMError(D_CONFIRM, "メモリが確保できません。");
  341.         return;
  342.     }
  343.  
  344.     /* ワーク用ビッツハンドルを確保する */
  345.     lBitsHdl = GMNewBits(G_GR2, &lrc, 0);
  346.     if (lBitsHdl == NULL) {
  347.         GMDisposeRgn(rgnHdl);    /* リージョンハンドルを解放する    */
  348.         DMError(D_CONFIRM, "メモリが確保できません。");
  349.         return;
  350.     }
  351.  
  352.     /* ビッツを使用するためにハンドルをロックする */
  353.     GMLockBits(pcv->offBitsHdl[pcv->offIdx]); /* オフスクリーン用ビッツ */
  354.     GMLockBits(lBitsHdl);        /* ワークビッツ            */
  355.  
  356.     /* オフスクリーンのビットマップからワークのビットマップにコピーする */
  357.     GMCopy(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, &(*lBitsHdl)->bmap,
  358.         &pcv->rcLupe, &lrc, G_PSET, NULL);
  359.  
  360.     /* 同じ色の点の領域をリージョンに変換する */
  361.     errCode = GMPaintRgn(rgnHdl, &(*lBitsHdl)->bmap, pt2.x_y);
  362.     if (errCode < 0) {
  363.         GMDisposeRgn(rgnHdl);    /* リージョンハンドルを解放する    */
  364.         /* ビッツハンドルをアンロックする */
  365.         GMUnlockBits(pcv->offBitsHdl[pcv->offIdx]);
  366.         GMUnlockBits(lBitsHdl);
  367.         /* ワーク用のビッツハンドルを廃棄する */
  368.         GMDisposeBits(lBitsHdl);
  369.         DMError(D_CONFIRM, "メモリが確保できません。");
  370.         return;
  371.     }
  372.  
  373.     pt.x_y = pcv->rcLupe.l.l_t;
  374.  
  375.     /* リージョン座標をオフスクリーンの座標系に設定する */
  376.     GMSlideRgn(rgnHdl, pcv->rcLupe.l.l_t);
  377.  
  378.     /* オフスクリーン用グラフをカレントグラフにする */
  379.     GMSetGraph(&pcv->offGraph);
  380.     pcv->offGraph.bmap = &(*pcv->offBitsHdl[pcv->offIdx])->bmap;
  381.  
  382.     /* リージョンを囲むレクタングルの座標をrcに設定する */
  383.     rc = (*rgnHdl)->bounds;
  384.     /* 転送先のルーペウィンドウのレクタングルをlrcに設定する */
  385.     lrc.d.left = 1 + (rc.d.left - pcv->rcLupe.d.left) * pcv->lupeRate;
  386.     lrc.d.right = lrc.d.left + (rc.d.right - rc.d.left) * pcv->lupeRate;
  387.     lrc.d.top = WS_INSIDE_Y + (rc.d.top - pcv->rcLupe.d.top) * pcv->lupeRate;
  388.     lrc.d.bottom = lrc.d.top + (rc.d.bottom - rc.d.top) * pcv->lupeRate;
  389.  
  390.     /* フォア/バックグラウンドカラーをセットする */
  391.     setFBColor(pcv);
  392.     /* 領域を塗りつぶす */
  393.     GMFillRgn(rgnHdl);
  394.  
  395.     /* メインウィンドウをグラフィックタイプでカレントグラフにする */
  396.     setGraph(pcv->windowPtr, G_GRP);
  397.  
  398.     /* オフスクリーンからコピーして描画する */
  399.     GMTransImg(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, pcv->windowPtr->graph.bmap, &rc, &rc);
  400.  
  401.     /* ルーペウィンドウをグラフィックタイプでカレントグラフにする */
  402.     setGraph(&pcv->subwinPtr[LUPE]->win, G_GRP);
  403.  
  404.     /* オフスクリーンからコピーして描画する */
  405.     GMTransImg(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, pcv->subwinPtr[LUPE]->win.graph.bmap, &rc, &lrc);
  406.  
  407.     /* ビッツハンドルをアンロックする */
  408.     GMUnlockBits(pcv->offBitsHdl[pcv->offIdx]);
  409.     GMUnlockBits(lBitsHdl);
  410.  
  411.     GMDisposeBits(lBitsHdl);        /* ワーク用のビッツハンドルを解放する */
  412.  
  413.     GMDisposeRgn(rgnHdl);        /* リージョンハンドルを解放する    */
  414. }
  415.  
  416. /******************************************************************************
  417.  *    drawLupeWnd():    ルーペウィンドウを描画する
  418.  ******************************************************************************
  419.  *    引数:    ComVal *pcv    共通変数へのポインタ
  420.  */
  421. void drawLupeWnd(ComVal *pcv)
  422. {
  423.     drawSubwin(pcv, 3);        /* サブウィンドウを描画する    */
  424.  
  425.     drawLupeSubIcon(pcv);
  426.  
  427.     /* ルーペウィンドウの中を描画する */
  428.     drawLupeRect(pcv);
  429. }
  430.  
  431. /******************************************************************************
  432.  *    drawLupeSubIcon():    ルーペウィンドウタイトル部のサブアイコンを描画する
  433.  ******************************************************************************
  434.  *    引数:    ComVal *pcv    共通変数へのポインタ
  435.  */
  436. void drawLupeSubIcon(ComVal *pcv)
  437. {
  438.     /* ルーペウィンドウをテキストタイプでカレントグラフにする */
  439.     setGraph(&pcv->subwinPtr[LUPE]->win, G_TXT);
  440.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  441.  
  442.     /* ペン */
  443.     if (HIWORD(pcv->toolStat[4]) == 0)
  444.         /* ペンのビットイメージを表示する */
  445.         GMPutRImg(*pcv->tlBtnImg[17], LONGWORD(320, 2));
  446.     /* 塗りつぶし */
  447.     else if (HIWORD(pcv->toolStat[4]) == 1)
  448.         /* 塗りつぶしのビットイメージを表示する */
  449.         GMPutRImg(*pcv->tlBtnImg[18], LONGWORD(320, 2));
  450.  
  451.     /* ルーペの倍率によってアイコンの表示を変える */
  452.     if (LOWWORD(pcv->toolStat[4]) == 0)    /* 4倍 */
  453.         /* ×4のビットイメージを表示する */
  454.         GMPutRImg(*pcv->tlBtnImg[19], LONGWORD(340, 2));
  455.     else if (LOWWORD(pcv->toolStat[4]) == 1) /* 8倍 */
  456.         /* ×8のビットイメージを表示する */
  457.         GMPutRImg(*pcv->tlBtnImg[20], LONGWORD(340, 2));
  458. }
  459.  
  460. /******************************************************************************
  461.  *    drawLupeRect():    ルーペウィンドウの内部を描画する
  462.  ******************************************************************************
  463.  *    引数:    ComVal *pcv    共通変数へのポインタ
  464.  */
  465. void drawLupeRect(ComVal *pcv)
  466. {
  467.     Rect rc, rc_p, lrc_p;
  468.  
  469.     /* ルーペウィンドウをカレントグラフにする */
  470.     GMSetGraph(&pcv->subwinPtr[LUPE]->win.graph);
  471.  
  472.     /* 絵と拡大レクタングルの共通部分を求める */
  473.     GMAndRect(&rc_p, &pcv->rcLupe, &pcv->pictSize);
  474.     /* ルーペウィンドウに描画する大きさを求める */
  475.     lrc_p.l.l_t = rcLupeDraw.l.l_t;
  476.     lrc_p.d.right = lrc_p.d.left + (rc_p.d.right - rc_p.d.left) * pcv->lupeRate;
  477.     lrc_p.d.bottom = lrc_p.d.top + (rc_p.d.bottom - rc_p.d.top) * pcv->lupeRate;
  478.  
  479.     /* ルーペウィンドウをテキストタイプでカレントグラフにする */
  480.     setGraph(&pcv->subwinPtr[LUPE]->win, G_TXT);
  481.     GMAPage(G_ALLPAGE);        /* アクセスページを全ページにする */
  482.     OldPM = GMPenMode(G_PSET);
  483.     /* フォアグラウンドカラーをライトグレーにする */
  484.     OldFC = GMForeColor(G_LGRAY);
  485.     /* 絵がルーペウィンドウよりも小さいときは余った部分をライトグレーで塗る */
  486.     if (lrc_p.d.right < rcLupeDraw.d.right) {
  487.         rc = rcLupeDraw;
  488.         rc.d.left = lrc_p.d.right;
  489.         /* ライトグレーでウィンドウを塗りつぶす */
  490.         GMFillRect(&rc);
  491.     }
  492.     if (lrc_p.d.bottom < rcLupeDraw.d.bottom) {
  493.         rc = rcLupeDraw;
  494.         rc.d.top = lrc_p.d.bottom;
  495.         /* ライトグレーでウィンドウを塗りつぶす */
  496.         GMFillRect(&rc);
  497.     }
  498.     GMForeColor(G_THRU);        /* フォアグラウンドカラーは透明色 */
  499.     /* 透明色でウィンドウを塗りつぶす */
  500.     GMFillRect(&lrc_p);
  501.     GMForeColor(OldFC);
  502.     GMPenMode(OldPM);
  503.  
  504.     /* ルーペウィンドウをグラフィックタイプでカレントグラフにする */
  505.     setGraph(&pcv->subwinPtr[LUPE]->win, G_GRP);
  506.  
  507.     GMLockBits(pcv->offBitsHdl[pcv->offIdx]);
  508.     pcv->offGraph.bmap = &(*pcv->offBitsHdl[pcv->offIdx])->bmap;
  509.  
  510.     GMTransImg(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, pcv->subwinPtr[LUPE]->win.graph.bmap, &pcv->rcLupe, &rcLupeDraw);
  511.  
  512.     GMUnlockBits(pcv->offBitsHdl[pcv->offIdx]);
  513. }
  514.  
  515. /******************************************************************************
  516.  *    changeLupeRate():    ルーペの拡大倍率を変更
  517.  ******************************************************************************
  518.  *    引数:    ComVal *pcv    共通変数へのポインタ
  519.  *        int mode    拡大倍率
  520.  *                = 0: 4倍
  521.  *                = 1: 8倍
  522.  */
  523. void changeLupeRate(ComVal *pcv, int mode)
  524. {
  525.     /* ルーペウィンドウをカレントグラフにする */
  526.     GMSetGraph(&pcv->subwinPtr[LUPE]->win.graph);
  527.     /* ルーペウィンドウにアイコンを描く */
  528.     drawLupeSubIcon(pcv);
  529.     /* 倍率の選択ならば */
  530.     if (pcv->lupeStat == 0) {
  531.         /* 拡大エリアの消去 */
  532.         dispLupeRect(pcv);
  533.         if (mode == 1) {
  534.             /* 拡大率を8倍にする */
  535.             pcv->lupeRate = 8;
  536.             /* 拡大範囲レクタングルを縮小する */
  537.             pcv->rcLupe.d.right -= 50;
  538.             pcv->rcLupe.d.bottom -= 50;
  539.         } else {
  540.             /* 拡大率を4倍にする */
  541.             pcv->lupeRate = 4;
  542.             /* 拡大範囲レクタングルを拡大する */
  543.             pcv->rcLupe.d.right += 50;
  544.             pcv->rcLupe.d.bottom += 50;
  545.             /* レクタングルの右端、下端がウィンドウの外なら */
  546.             /* レクタングルがウィンドウ内に入るように調節する */
  547.             if (pcv->rcLupe.d.right > pcv->pictSize.d.right) {
  548.                 pcv->rcLupe.d.right = pcv->pictSize.d.right;
  549.                 pcv->rcLupe.d.left = pcv->pictSize.d.right - 100;
  550.             }
  551.             if (pcv->rcLupe.d.bottom > pcv->pictSize.d.bottom) {
  552.                 pcv->rcLupe.d.bottom = pcv->pictSize.d.bottom;
  553.                 pcv->rcLupe.d.top = pcv->pictSize.d.bottom - 100;
  554.             }
  555.             if (pcv->rcLupe.d.left < 0) {
  556.                 pcv->rcLupe.d.left = 0;
  557.                 pcv->rcLupe.d.right = 100;
  558.             }
  559.             if (pcv->rcLupe.d.top < 0) {
  560.                 pcv->rcLupe.d.top = 0;
  561.                 pcv->rcLupe.d.bottom = 100;
  562.             }
  563.         }
  564.         dispLupeRect(pcv);    /* 拡大エリアの表示 */
  565.         drawLupeRect(pcv);    /* ルーペウィンドウの内部を描く */
  566.     }
  567. }
  568.